emoji: Skip overly wide fallback rendering
authorMatthias Clasen <mclasen@redhat.com>
Mon, 18 Dec 2017 03:09:08 +0000 (22:09 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 15 Jan 2018 13:21:52 +0000 (08:21 -0500)
Some emoji fonts (such as Emoji One), render Emoji sequences
such as some of the family variations using multiple individual
glyphs. This rendering is too wide and breaks our grid layout.
Therefore, we will just skip any sequence whose rendering is
more than twice as wide as a simple smiley.

gtk/gtkemojichooser.c

index 232fc13eeba8a69baf8a00f63b64f603589142fe..daa565bef793b223ff6af52e3a8d436730c3f560 100644 (file)
@@ -361,6 +361,9 @@ add_emoji (GtkWidget    *box,
   char text[64];
   char *p = text;
   int i;
+  PangoLayout *layout;
+  PangoRectangle rect;
+  int width;
 
   codes = g_variant_get_child_value (item, 0);
   for (i = 0; i < g_variant_n_children (codes); i++)
@@ -376,12 +379,27 @@ add_emoji (GtkWidget    *box,
   g_variant_unref (codes);
   p[0] = 0;
 
-  label = gtk_label_new (text);
+  label = gtk_label_new ("🙂");
   attrs = pango_attr_list_new ();
   pango_attr_list_insert (attrs, pango_attr_scale_new (PANGO_SCALE_X_LARGE));
   gtk_label_set_attributes (GTK_LABEL (label), attrs);
   pango_attr_list_unref (attrs);
 
+  layout = gtk_label_get_layout (GTK_LABEL (label));
+  pango_layout_get_extents (layout, &rect, NULL);
+  width = rect.width;
+
+  gtk_label_set_text (GTK_LABEL (label), text);
+  layout = gtk_label_get_layout (GTK_LABEL (label));
+  pango_layout_get_extents (layout, &rect, NULL);
+
+  /* Check for fallback rendering that generates too wide items */
+  if (rect.width >= 2 * width)
+    {
+      gtk_widget_destroy (label);
+      return;
+    }
+
   child = gtk_flow_box_child_new ();
   gtk_style_context_add_class (gtk_widget_get_style_context (child), "emoji");
   g_object_set_data_full (G_OBJECT (child), "emoji-data",